home *** CD-ROM | disk | FTP | other *** search
/ The X-Philes (2nd Revision) / The X-Philes Number 1 (1995).iso / xphiles / hp48_1 / grob_to.bit < prev    next >
Text File  |  1995-03-23  |  5KB  |  189 lines

  1. From arne%SFD.UIT.NO@VM1.NoDak.EDU Sun Apr 22 20:02:03 1990
  2. Date:         Sun, 22 Apr 90 19:59:59 met
  3. Reply-To: HP-48 -  HP-48sx Hand Held System <HP-48@VM1.NoDak.EDU>
  4. Sender: HP-48 -  HP-48sx Hand Held System <HP-48@VM1.NoDak.EDU>
  5. From: Arne Helme <arne%SFD.UIT.NO@VM1.NoDak.EDU>
  6. To: Multiple recipients of list HP-48 <HP-48@NDSUVM1>
  7.  
  8. Hello HP48sx users !
  9. This is a little hack I wrote to convert GROB's into portable bitmaps.
  10. It takes input from stdin or a file and writes to stdout (UNIX !).
  11. You can convert a portable bitmap into many other interesting formats
  12. using the pbmplus package (referenced below). Please report bugs or
  13. improvements.
  14.  
  15. -- Arne Helme (E-mail : arne@sfd.uit.no)
  16.  
  17. /* -*-C-*-
  18. ********************************************************************************
  19. *
  20. * File:         grob2pbm.c
  21. * RCS:          $Header: $
  22. * Description:  HP48sx ASCII GROB format to PBM (portable bitmap)
  23. * Author:       Arne Helme
  24. * Created:      Fri Mar 30 09:12:31 1990
  25. * Modified:     Sun Apr 22 15:20:34 1990 (Arne Helme) arne@dstud2
  26. * Language:     C
  27. * Package:      N/A
  28. * Status:       Experimental (Do Not Distribute)
  29. *
  30. * (c) Copyright 1990, arne@sfd.uit.no, all rights reserved.
  31. *
  32. ********************************************************************************
  33. */
  34.  
  35. /*
  36.   DESCRIPTION
  37.  
  38.       This program converts a HP48sx ASCII GROB file into a portable bitmap.
  39.   Export your HP48sx GROBs to your computer, convert them to your favorite
  40.   format and use them in your documents.
  41.   The portable bitmap (PBM) is a interchange format in the Extended Portable
  42.   Bitmap Toolkit written by Mr. Jef Poskanzer and the
  43.   PBM software is public domain.
  44.  
  45.   STATUS
  46.  
  47.       A two hour's hack.
  48.  
  49.   KNOWN BUGS
  50.  
  51.       Wont take binary GROBS yet. Only tested on UNIX systemV machines.
  52.  
  53.   NOTE
  54.  
  55.       A public domain PBM package is available via anonymous ftp to
  56.       sfd.uit.no [128.39.60.50] (pub/X11/pbmplus.tar.Z).
  57. */
  58.  
  59. #include <stdio.h>
  60.  
  61. #define GROB_MAGIC       "GROB"
  62. #define PBM_MAGIC        "P1"
  63. #define SPACE            ' '
  64. #define NEWLINE          '\n'
  65. #define ZERO             '0'
  66. #define ONE              '1'
  67. #define TRANSLATE        '%'
  68. #define HP48sxHEADERSIZE 25
  69. #define MAXLINE          64
  70. #define ASCIISIZE        (int)((width / 4) + 1) * height
  71.  
  72. void convert (nibble, num)
  73. int *nibble, num;
  74. {
  75.     int i;
  76.  
  77.     for (i = 0; i < num; i++) {
  78.     *nibble & 1 ? fputc (ONE, stdout) : fputc (ZERO, stdout);
  79.     fputc (SPACE, stdout);
  80.     *nibble >>= 1;
  81.     }
  82. }
  83.  
  84. void main(argc, argv)
  85. int argc;
  86. char *argv[];
  87. {
  88.  
  89.     FILE *fp;                       /* File pointer for reading GROB data */
  90.     char  header[HP48sxHEADERSIZE]; /* GROB header                        */
  91.     int   ch;                       /* Temporary character                */
  92.     int   width;                    /* GROB width                         */
  93.     int   height;                   /* GROB height                        */
  94.     int   nibble1, nibble2;         /* Each containing a 4 bit nibble     */
  95.     int   i, count, line = 0;       /* Loop and control registers         */
  96.  
  97.     /* Parse command line */
  98.     switch (argc) {
  99.     case 1:
  100.     /* We'll have to read from stdin */
  101.     fp = stdin;
  102.     break;
  103.     case 2:
  104.     /* Program started with one argument, assume it is a filename */
  105.     fp = fopen (argv[1], "r");
  106.     if (fp == (FILE *)NULL) {
  107.         fprintf (stderr, "%s : unable to read file %s\n",
  108.              argv[0], argv[1]);
  109.         exit (1);
  110.     }
  111.     break;
  112.     default :
  113.     /* Unable to parse command line */
  114.     fprintf (stderr, "Usage : %s <GROBfile>\n", argv[0]);
  115.     exit (1);
  116.     }
  117.  
  118.     /* Skip HP48sx translation information if any */
  119.     if ((ch = fgetc(fp)) == EOF) {
  120.     fprintf (stderr, "%s : unexpected end-of-file found\n",
  121.          argv[0]);
  122.     exit (1);
  123.     }
  124.  
  125.     if (ch == TRANSLATE) {
  126.     if (fgets (header, HP48sxHEADERSIZE, fp) == NULL) {
  127.         fprintf (stderr, "%s : error reading HP48sx header\n", argv[0]);
  128.         exit (1);
  129.     }
  130.     } else
  131.     ungetc (ch, fp);
  132.  
  133.     if (fscanf (fp, "%s", header) != 1) {
  134.     fprintf (stderr, "%s : error reading GROB magic number\n", argv[0]);
  135.     exit (1);
  136.     }
  137.  
  138.     if (strcmp(header, GROB_MAGIC)) {
  139.     fprintf (stderr, "%s : bad magic number\n", argv[0]);
  140.     exit (1);
  141.     }
  142.  
  143.     if (fscanf (fp, "%d %d", &width, &height) != 2) {
  144.     fprintf (stderr, "%s : unable to read GROB size\n", argv[0]);
  145.     exit (1);
  146.     }
  147.  
  148.     /* Print new magic number and sizes to stdout */
  149.     printf ("%s\n%d %d\n", PBM_MAGIC, width, height);
  150.  
  151.     /* Skip blank if any*/
  152.     if ((ch =fgetc(fp)) != ' ')
  153.     ungetc (ch, fp);
  154.  
  155.     /* Convert GROB data to PBM data */
  156.     for (i=0; i < height; i++) {
  157.     count = width;
  158.     do {
  159.         /* Scan in two four-bit nibbles (one byte) */
  160.         fscanf (fp, "%1X%1X", &nibble1, &nibble2);
  161.  
  162.         /* Check if we are in the last bits of current line */
  163.         if (count >= 8) {
  164.         /* Convert 1st 4 bit nibble */
  165.         convert (&nibble1, 4);
  166.  
  167.         /* Convert 2nd 4 bit nibble */
  168.         convert (&nibble2, 4);
  169.         } else { /* Last bits, watch out for padded bits */
  170.  
  171.         /* check if we have a complete 1st four bit nibble */
  172.         if (count >= 4) {
  173.             convert (&nibble1, 4);
  174.             convert (&nibble2, count - 4);
  175.         } else
  176.             convert (&nibble1, count);
  177.         }
  178.  
  179.         /* PBM wont't take lines longer than 70 chars, insert newline */
  180.         line += 16;
  181.         if (!(line % MAXLINE))
  182.         fputc (NEWLINE, stdout);
  183.     } while ((count -= 8) > 0);
  184.     }
  185.     fclose (stdout);
  186. }
  187.  
  188.  
  189.